<?php defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * user class
 *
 * Manage logged user information.
 *
 * @package        	CodeIgniter
 * @subpackage    	Library
 * @category    	Library
 * @author        	Charles(xiezhenjiang@foxmail.com)
 * @license         http://www.gnu.org/licenses/gpl.html
 * @link			http://www.oserror.com
 */

class Acl{
	
	/**
	 *@_CI //定义CI超级资源属性
	 *@$_Menus_c 一次性读取所有授权的菜单数组，以备后面生成需要的树函数调用
	 */
	protected $_CI;
	protected $_menus;
	
	/**
	 * 构造函数
	 * @公共 访问
	 */
	function __construct()
	{
		$this->_CI = &get_instance();//引用CI超级资源
		//$this->_CI->load->config('yjoa_config',true);
		$this->_CI->load->library('session');
		$this->_CI->load->model('user_m');//载入用户模型
		//$this->_CI->load->helper('cookie');
		
		//$this->message_start_delimiter = $this->_CI->config->item('message_start_delimiter', 'yjoa_config');
		//$this->message_end_delimiter = $this->_CI->config->item('message_end_delimiter', 'yjoa_config');
		//$this->error_start_delimiter = $this->_CI->config->item('error_start_delimiter', 'yjoa_config');
		//$this->error_end_delimiter = $this->_CI->config->item('error_end_delimiter', 'yjoa_config');
		
		$this->_menus = $this->_CI->user_m->get_user_sub_menu_by_username($this->_CI->session->userdata('user_name'));

	}


//-----------------------------------------------------------------------------------------------------------------------------------以前的
	/**
	 * 取得一级菜单，并返回数组（不进行深度递归）
	 * @公共 访问
 	 * @参数 字符串 $id 
	 * @返回 数组 排序后的值
	 */
	function get_parent_array()
	{
		if($this->_menus)
		{
			$array = array();
			foreach($this->_menus as $value)
			{
				if ($value['parentId'] == 0)
				{ 
					$array[] = $value;
				}
			}
			return $this->multi_array_sort($array, 'sort',SORT_ASC);//二维数组排序
		}else
		{
			return false;
		}
	}
	
	/**
	 * 二维数组排序函数
	 * @公共 访问
 	 * @参数 $multi_array 待处理的数组，$sort_field 待排序元素，$sort_type 排序方法
	 * @返回 数组 排序后的值
	 */
	function multi_array_sort($multi_array,$sort_field,$sort_type = SORT_ASC)
	{
		if (!is_array($multi_array)) return FALSE;
		foreach ($multi_array as $row)
		{
			if(! is_array($row)) return FALSE;
			$arr_field[] = $row[$sort_field];
		}
		array_multisort($arr_field,$sort_type,$multi_array);
		return $multi_array;
	}


	//取得所有菜单
	//function get_all_menus(){
	//	$this->menus = $this->user_m->get_user_sub_menu_by_username($this->user_name);
	//}
	
	/**
	 * 根据指定父ID取得所有子菜单数组
	 * @公共 访问
 	 * @参数 字符串 $pid 
	 * @返回 数组 排序后的值
	 */
	function get_child_array($pid = 0){
		$myarr = $this->get_tree($this->_menus,$pid);
		return $this->multi_array_sort($myarr, 'sort',SORT_ASC);
	}

	/** 
	* 数组根据父id生成树 
	* @staticvar int $depth 递归深度 
	* @param array $data 数组数据 
	* @param integer $pid 父id的值 
	* @param string $key id在$data数组中的键值 
	* @param string $chrildKey 要生成的子的键值 
	* @param string $pKey 父id在$data数组中的键值 
	* @param int $maxDepth 最大递归深度，防止无限递归 
	* @return array 重组后的数组 
	*/  
	function get_tree($data, $pid = 0, $key = 'id', $pKey = 'parentId', $childKey = 'children', $maxDepth = 0){  
		 static $depth = 0;  
		 $depth++;  
		 if (intval($maxDepth) <= 0)  
		 {  
			 $maxDepth = count($data) * count($data);  
		 }  
		 if ($depth > $maxDepth)  
		 {  
			 exit("递归错误：最大递归深度 {$maxDepth}");  
		 }  
		 $tree = array();  
		 foreach ($data as $rk => $rv)  
		 {  
			 if ($rv[$pKey] == $pid)  
			 {  
				 $rv[$childKey] = $this->get_tree($data, $rv[$key], $key, $pKey, $childKey, $maxDepth);  
				 $tree[] = $rv;  
			 }  
		 }  
		 return $tree;  
	} 

	

	
//==============================================================================================================检查权限
	/**
	 * 检查用户权限
	 * @公共 访问
	 * @参数 字符串 $action
	 * @返回 true or false
	 */
	function check_privilege($action){

		$username = $this->_CI->session->userdata('user_name');
		if($username == 'admin'){
			return true;
		}else{
			$privilege = $this->_CI->user_m->check_user_privilege($username, $action);
			return $privilege;
		}
	}
}